package com.briup.myblog.web.interceptor;

import com.briup.myblog.exception.CustomerException;
import com.briup.myblog.utils.GetToken;
import com.briup.myblog.utils.JwtUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Objects;

/**
 * 对删除操作的请求拦截进行token认证
 * 并从token中获取到用户的权限
 * 判断用户访问时，在请求头中提供的jwt字符串是否合法
 * @author 林观海
 */
@Slf4j
@Component
public class DeleteInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response,Object handler){
        log.info("删除拦截器执行前拦截....");

        /**
         * 项目是前后端分离项目，导致浏览器会发送预检请求Options,不需要进行拦截判断
         * 当使用请求头获取信息时必须要有对预检请求Options的处理
         * 因为浏览器在每次刷新页面时都会发送预检请求，不处理将会导致拦截器不通过拿不到token
         */
        String method = request.getMethod();
        if(method.equals("OPTIONS")){
            return true;//通过拦截
        }
        //2.当请求是正常请求时，获取到请求头认证信息
        String token = GetToken.getToken(request);

        Object role = JwtUtil.getInfo(token).get("role");
        log.info("进行权限判断(0管理员，1普通用户)：" + role);
        //0是管理员，1是普通用户
        if (Objects.equals(role, 1)) {
            throw new CustomerException("没有权限");
        }
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception{
        log.info("删除拦截器执行结束后拦截....");
    }


}
